#include <linux/sched.h>
#include <asm/system.h>

void divide_error(void);

static void die(char * str, long esp_ptr, long nr)
{
    long * esp = (long *) esp_ptr;
    int i;

    printk("%s: %04x\n\r",str, nr & 0xffff);
    printk("EIP:\t%04x:%p\n\rEFLAGS:\t%p\n\rESP:\t%04x:%p\n\r",
        esp[1], esp[0], esp[2], esp[4], esp[3]);
    cli();
    while (1);
}

void do_divide_error(long esp, long error_code)
{
    die("divide error", esp, error_code);
}

void trap_init(void)
{
    set_trap_gate(0, &divide_error);
}
